查看原文
其他

R-数据处理基础篇-一篇概括总结R语言变量储存结构

申泽西 TheWhoOPs 2021-09-19

目录

  • 0.问题导入

  • 1.示例数据及样本程序

  • 2.R语言数据变量存储方式二之矩阵(matrix)

  • 3.R语言数据变量存储方式三之数据框(data.frame)

  • 4.R语言数据变量存储方式四之列表(list)

  • 5.总结

  • 6.致谢


0. 问题导入

当我们学习任何一门新的计算机语言的时候,开篇除了系统与语言环境配置,正式开始入门的就是该语言的变量储存方式与传递方式。但是,这部分真的总是整本书中最单调且朴实无华又有用的部分,而真正能够熟练掌握函数的唯一途径就是在实际过程中多用多练!!为了大家方便,我们将本篇的代码做成了一个R语言脚本,有需要的可以在【TheWhoOPs】公众号后边回复“基础数据处理”获取本篇代码哈~

为了缩短大家这块的学习时间,尽快入门,Jersey 特意将R语言变量储存结构进行了总结,大家看这篇基本可以开始实践啦

1.示例数据及样本程序

1.1 示例数据-R语言变量存储方式一:向量

如下例代码,本篇Jersey首先采用 runif()函数随机生成了一个长度(length)为20且取值范围在-10 ~10之间的随机实数组(runif(20,-10,10)),也引出了R语言第一种变量的储存方式:向量(vector)

向量属性及对应查询方式:

  • 1. 长度(length):length(变量名),i.e length(df)

  • 2. 数据类型: class(变量名),i.e. class(df),数据类型常用的为numeric (数字)character(字符串)

  • 3. 判断方式: 判断其是否为向量函数 is.vector(变量名),i.e., is.vector(df)。

df = runif(20,-10,10)
head(df)
[1] -8.812040 -4.816596 -9.746894
[4] 5.261308 1.101738 -7.904380
length(df)
[1] 20
class(df)
[1] "numeric"
is.vector(df)
[1] TRUE
1.2 样本程序

本篇入门篇示例函数不再是hello world,而是加油武汉!!

fighting_for_wuhan <-function(){
return("Fighting!! WUHAN")
}

R语言中函数的通常储存及调用方法:

2. R语言数据变量存储方式二之矩阵(matrix)

在第二节,我们基于示例数据df对R语言中的变量存储方式二:矩阵(matrix)进行具体介绍

2.1 基于向量的矩阵生成方法1

首先我们可以基于as.matrix()函数将向量型的数据转化为矩阵(matrix),不过如下代码所示,只能转为单列的矩阵。如果需要将其转为5行4列,或是4行5列,我们需要基于2.2 的方法。

mat1 = as.matrix(df)
mat1
[,1]
[1,] 1.51572303
[2,] -0.45631803
[3,] 0.92141092
[4,] -0.03206002
[5,] -9.00933680
[6,] -5.25229404
[7,] 3.95230102
[8,] 7.94604772
[9,] -8.06965130
[10,] -2.81624416
[11,] -3.64163339
[12,] 9.16364793
[13,] -6.33998803
[14,] -4.56757486
[15,] -2.48729855
[16,] 3.05898896
[17,] 2.51979639
[18,] 4.19247441
[19,] -9.92194021
[20,] 0.69833583
dim(mat1)
dim(mat1)
[1] 20 1
2.2 基于向量的矩阵生成方法2

基于向量的矩阵生成方法2 则是基于matrix函数,以向量为首项输入,行数为参数(nrow)进行生成。但是再生成的过程中有个重要的参数需要注意:byrow = T/Fbyrow这个布尔变量(其实就是是或否)到底是T(是)或F(否)默认状态下为F,则会逐列进行生成矩阵,如mat2_by_row;如果是T,则会逐行生成矩阵

mat2_by_col = matrix(df,nrow = 4)
mat2_by_row = matrix(df,nrow = 4,byrow = T)
mat2_by_col
[,1] [,2] [,3] [,4] [,5]
[1,] 1.51572303 -9.009337 -8.069651 -6.339988 2.5197964
[2,] -0.45631803 -5.252294 -2.816244 -4.567575 4.1924744
[3,] 0.92141092 3.952301 -3.641633 -2.487299 -9.9219402
[4,] -0.03206002 7.946048 9.163648 3.058989 0.6983358
mat2_by_row
[,1] [,2] [,3] [,4] [,5]
[1,] 1.515723 -0.456318 0.9214109 -0.03206002 -9.0093368
[2,] -5.252294 3.952301 7.9460477 -8.06965130 -2.8162442
[3,] -3.641633 9.163648 -6.3399880 -4.56757486 -2.4872986
[4,] 3.058989 2.519796 4.1924744 -9.92194021 0.6983358
2.3 类似于面包切片似的矩阵切片

有时候我们只需要矩阵中的一列、连续几列与特定几列,那么我们应该怎么做呢?这时我们就需要像切面包一样,对矩阵进行竖向切片。提取矩阵中的第一列,单列提取后mat_v1为向量

mat_v1 = mat2_by_col[,1]

提取矩阵中的第1-3列

mat_v123 = mat2_by_col[,1:3]

提取矩阵中的第2和第4列

mat_v24 = mat2_by_col[,c(2,4)]

以上是单纯提取列的提取方法,提取行的方法与其类似,只需要把相应的中括号逗号之后的内容移到逗号前就可以实现。那么新问题又出来了,如何同时提取行与列(图3)?提取矩阵中由a,b,c,d组成的2✖️2矩阵

mat_vh = mat2_by_col[2:3,2:3]

3. R语言数据变量存储方式三之数据框(data.frame)

3.1 data.frame的生成方式1-由矩阵进行转化
df1 = as.data.frame(mat2_by_col)
df1
V1 V2 V3 V4 V5
1 1.51572303 -9.009337 -8.069651 -6.339988 2.5197964
2 -0.45631803 -5.252294 -2.816244 -4.567575 4.1924744
3 0.92141092 3.952301 -3.641633 -2.487299 -9.9219402
4 -0.03206002 7.946048 9.163648 3.058989 0.6983358
3.2 data.frame的生成方式2-data.frame函数生成
df2 = data.frame(V1 = 1:4,
V2 = 5:8,
V3 = 9:12,
V4 = 13:16,
V5 = 17:20)
df2
V1 V2 V3 V4 V5
1 1 5 9 13 17
2 2 6 10 14 18
3 3 7 11 15 19
4 4 8 12 16 20
3.3 data.frame的切片与增加方式

data.frame 除了可以像矩阵matrix一样方式的切片之外,data.frame还有自己的一套索引方法,即根据列名进行索引。

V1 = df2$V1
V1
[1] 1 2 3 4

此外,data.frame 还可以通过“$”符号进行列的增加,注意必须与其他列的长度一样!

df2$V6 = 21:24
df2
V1 V2 V3 V4 V5 V6
1 1 5 9 13 17 21
2 2 6 10 14 18 22
3 3 7 11 15 19 23
4 4 8 12 16 20 24

4. R语言数据变量存储方式四之列表(list)

如果说矩阵(matrix)与数据框(data.frame)可以装字符,数字,数字与字符混装之外,列表(list)较其功能来讲来说就像多来A梦的兜子一样,什么都可以装,什么矩阵啊,数据框啊,函数啊,我们地理中经常用到的Raster 文件啊,都可以装!!而且不光可以装同类的,还可以混装不同类的数据,你就说厉不厉害!!

4.1 往list中装货
list1 = list(fighting_for_wuhan, mat2_by_col, df2)
list1
[[1]]
function ()
{
return("Fighting!! WUHAN")
}
<bytecode: 0x119344590>

[[2]]
[,1] [,2] [,3] [,4] [,5]
[1,] 1.51572303 -9.009337 -8.069651 -6.339988 2.5197964
[2,] -0.45631803 -5.252294 -2.816244 -4.567575 4.1924744
[3,] 0.92141092 3.952301 -3.641633 -2.487299 -9.9219402
[4,] -0.03206002 7.946048 9.163648 3.058989 0.6983358

[[3]]
V1 V2 V3 V4 V5 V6
1 1 5 9 13 17 21
2 2 6 10 14 18 22
3 3 7 11 15 19 23
4 4 8 12 16 20 24
4.2 从list中取货

list中取货需要用双中括号加变量在list中的编号。如:

list1_fun = list1[[1]]
list1_fun
function(){
return("Fighting!! WUHAN")
}
<bytecode: 0x119344590>
list1_mat = list1[[2]]
list1_mat
[,1] [,2] [,3] [,4] [,5]
[1,] 1.51572303 -9.009337 -8.069651 -6.339988 2.5197964
[2,] -0.45631803 -5.252294 -2.816244 -4.567575 4.1924744
[3,] 0.92141092 3.952301 -3.641633 -2.487299 -9.9219402
[4,] -0.03206002 7.946048 9.163648 3.058989 0.6983358
list1_df = list1[[3]]
list1_df
V1 V2 V3 V4 V5 V6
1 1 5 9 13 17 21
2 2 6 10 14 18 22
3 3 7 11 15 19 23
4 4 8 12 16 20 24

5. 总结

本篇主要解决了以下几个问题:

  1. 如何正确创建,保存及链接程序到Rstudio?

  2. 如何创建并切片Matrix?

  3. 如何创建并切片Data.frame?

  4. 如何往List中装货与卸货?

6. 致谢

首先,感谢大家的持续关注,小编会继续努力,持续更新下去的!

大家如果觉得有帮助啊,还麻烦大家关注点赞,也可以扩散到朋友圈,多多引导朋友加入咱们这个简书技术平台, 代码共享推动科研进程, 多谢大家啦~

大家如果在使用本代码的过程有遇到问题的,可以留言评论,也可以私信我哈~~

祝大家身体健康,多多保重!!


扫描二维码

获取Jersey

联系方式


视频 小程序 ,轻点两下取消赞 在看 ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存